精通Linux系列六:查看文件内容(看完再也不用担心打开四十个G的文本文件服务器卡死了)
点击关注公众号,AI&编程干货及时送达
命令 | 含义 |
cat | 完整查看文件。 |
less | 一页一页地查看文本文件。 |
nl | 带有行号的查看文本文件。 |
head | 查看文本文件的开头几行。 |
tail | 查看文本文件的末尾几行。 |
strings | 显示嵌入在二进制文件中的文本。 |
od | 以八进制(或其他格式)查看数据。 |
在Linux中,你会遇到包含可读文本的文件,也会遇到包含你想以可读方式查看的二进制数据的文件。在这里,我们将演示如何在最基本层面上显示它们的内容。
cat
stdin stdout - 文件 -- 选项 --help --version
cat [选项] [文件]
最简单的查看器是cat
,它只是将其文件打印到标准输出,然后连接它们(因此得名):
→ cat 我的文件
大文件可能会滚动到屏幕外,所以如果你打算阅读输出,你可能需要考虑使用less
。话虽如此,cat
在将一组文件发送到shell管道中时特别有用:
→ cat 我的文件* | wc
cat
还可以以小方式处理其输出,可以选择显示非打印字符,预置行号(尽管nl
命令在此目的上更强大),并消除空白。
有用的选项
-T | 以^I的形式打印标签。 |
-E | 以$的形式打印新行。 |
-v | 以人类可读的格式打印其他非打印字符。 |
-n | 在每一行前预置行号。 |
-b | 在非空白行前预置行号。 |
-s | 将每个空白行序列压缩成一个单独的空白行。 |
less
stdin stdout[9] - 文件 -- 选项 --help --version
less [选项] [文件]
使用less
一次查看一个“页面”的文本(即,一次窗口或屏幕的文本):
→ less 我的文件
它非常适合文本文件,或者作为带有长输出的shell管道中的最后一个命令:
→ 命令1 | 命令2 | 命令3 | 命令4 | less
在运行less
时,键入h
以获取描述所有功能的帮助消息。这里有一些在文件中翻页的有用按键:
按键 | 意义 |
h, H | 查看帮助页面。 |
空格键,f ,^V ,^F | 向前移动一个屏幕。 |
Enter | 向前移动一行。 |
b ,^B ,ESC-v | 向后移动一个屏幕。 |
/ | 进入搜索模式。后面跟着一个正则表达式然后按回车,less 会查找第一个匹配行。 |
? | 和/一样,但它在文件中向后搜索。 |
n | 下一个匹配:重复你最近的向前搜索。 |
N | 重复你最近的向后搜索。 |
v | 用你的默认文本编辑器编辑当前文件(环境变量VISUAL 的值,如果未定义,则为EDITOR ,如果未定义,则为程序vi )。 |
<, g | 跳转到文件开头。 |
>, G | 跳转到文件末尾。 |
:n | 跳转到下一个文件。 |
:p | 跳转到上一个文件。 |
'less'有令人眼花缭乱的许多功能;我们只介绍最常见的。(例如,'less'会显示压缩Zip文件的内容:试试'less myfile.zip'。)强烈建议阅读手册页。
常用选项
-c | 在显示下一页之前清除屏幕。这可以避免滚动,可能对眼睛更舒服。 |
-m | 打印更详细的提示,显示到目前为止已显示的文件的百分比。 |
-N | 显示行号。 |
-r | 直接显示控制字符;通常'less'会将它们转换为易于人类阅读的格式。 |
-s | 将多个相邻的空行压缩成一个空行。 |
-S | 将长行截断为屏幕的宽度,而不是换行。 |
nl
stdin stdout - 文件 -- 选项 --帮助 --版本
nl [选项] [文件]
'nl'将其文件复制到标准输出,前面带有行号:
→ nl poem
1 从前,有一次,
2 有一个小操作系统,
3 名叫Linux,大家都喜欢它。
它比'cat'的'-n'和'-b'选项更灵活,提供了对编号的更大控制。
常用选项
-b [a、t、n、p R ] | 在所有行(a ),非空行(t ),没有行(n )或只有包含正则表达式*R *的行前添加编号。(默认=a ) |
-v N | 从整数*N *开始编号。 (默认=1) |
-i N | 每行编号增加*N *,所以例如,你可以只用奇数(-i2 )或偶数(-v2 -i2 )。 (默认=1) |
`-n [ln | rn |
-w N | 强制数字的宽度为*N *列。 (默认=6) |
-s S | 在行号和文本之间插入字符串*S *。 (默认=Tab ) |
head
stdin stdout - 文件 -- 选项 --帮助 --版本
head [选项] [文件]
'head'命令打印出文件的前10行,这对于预览内容非常好:
→ head myfile
→ head myfile* | less 预览多个文件
它也适合预览管道输出的前几行--比如说,当前目录中最近修改的10个文件:
→ ls -lta | head
常用选项
-n N | 打印前*N *行,而不是10行。 |
-N | 和 -n *N *相同。 |
-c N | 打印文件的前*N *字节。 |
-q | 安静模式:处理多个文件时,不在每个文件上打印横幅。通常,'head'会打印包含文件名的横幅。 |
tail
stdin stdout - 文件 -- 选项 --帮助 --版本
tail [选项] [文件]
'tail'命令打印出文件的最后10行,还有其他技巧:
→ tail myfile
→ nl myfile | tail 也可以看到行号
超级有用的'-f'选项让'tail'在另一个程序写入文件时主动监视一个文件,显示写入的新行。这对于监视正在使用的Linux日志文件非常宝贵,因为其他程序会写入它:
→ tail -f /var/log/syslog
常用选项
-n N | 打印文件的最后*N *行,而不是10行。 |
-N | 和 -n *N *相同。 |
-n + N | 打印除了前*N *行之外的所有行。 |
-c N | 打印文件的最后*N *字节。 |
-f | 保持文件打开,当行被追加到文件时,打印它们。这非常有用。如果文件还不存在,但你想等待它存在,那就添加 --retry 选项。 |
-q | 静默模式:当处理多个文件时,不在每个文件上方打印横幅。通常,tail(尾部) 会打印包含文件名的横幅。 |
strings
stdin stdout - file -- opt --help --version
strings [options] [files]
二进制文件,如可执行程序和对象文件,通常包含一些可读的文本。strings(字符串)
程序提取这些文本并在标准输出上显示。你可以用 strings(字符串)
发现版本信息,作者姓名,和其他有用的小信息:
→ strings /usr/bin/who
David MacKenzie
Copyright %s %d Free Software Foundation, Inc.
Report %s bugs to %s
...
结合 strings(字符串)
和 grep(全局搜索)
使你的探索更加有效。这里我们寻找电子邮件地址:
→ strings -n 10 /usr/bin/who | grep '@'
bug-coreutils@gnu.org
有用的选项
| -n *
length*
| 只显示长度大于 length
的字符串(默认为4)。 |
od
stdin stdout - file -- opt --help --version
od [options] [files]
当你想查看一个二进制文件时,可以考虑使用 od(八进制转储)
进行工作。它将一个或多个文件复制到标准输出,以 ASCII,八进制,十进制,十六进制,或浮点数,以及各种大小(字节,短,长)显示他们的数据。例如,此命令:
→ od -w8 /usr/bin/who
0000000 042577 043114 000401 000001
0000010 000000 000000 000000 000000
0000020 000002 000003 000001 000000
...
以八进制显示二进制文件 /usr/bin/who 中的字节,每行八个字节。左边的列包含每行的文件偏移量,也是以八进制表示。
如果你的二进制文件也包含文本,考虑使用 -tc
选项,它会显示字符数据。例如,像 who(谁)
这样的二进制可执行文件在开头包含字符串 "ELF":
→ od -tc -w8 /usr/bin/who | head -3
0000000 177 E L F 001 001 001 \0
0000010 \0 \0 \0 \0 \0 \0 \0 \0
0000020 002 \0 003 \0 001 \0 \0 \0
有用的选项
-N B | 只显示每个文件的前 B 个字节,可用十进制,十六进制(在前面加上 0x 或 0X),512 字节块(在后面加上 b ),千字节(在后面加上 k ),或兆字节(在后面加上 m )进行指定。(默认显示整个文件) |
-j B | 从每个文件的字节 B +1 开始输出;可接受的格式与 -N 选项相同。(默认=0) |
-w [ B ] | 每行显示 B 个字节;可接受的格式与 -N 选项相同。单独使用 -w 等价于 -w32 。(默认=16) |
-s [ B ] | 将每行字节组成 B 字节的序列,用空格隔开;可接受的格式与 -N 选项相同。单独使用 -s 等价于 -s3 。(默认=2) |
`-A (d | o |
`-t(a | c)[z]` |
`-t(d | o |
在 -t
选项后附加 z
会在输出的右边打印一个新的列,显示每行上的可打印字符。
你好,我是拾叁,7年开发老司机、互联网两年外企5年。怼得过阿三老美,也被PR comments搞崩溃过。这些年我打过工,创过业,接过私活,也混过upwork。赚过钱也亏过钱。一路过来,给我最深的感受就是不管学什么,一定要不断学习。只要你能坚持下来,就很容易实现弯道超车!所以,不要问我现在干什么是否来得及。如果你还没什么方向,可以先关注我,这里会经常分享一些前沿资讯和编程知识,帮你积累弯道超车的资本。